linux文件格式处理命令cut,grep,sed,awk:批量修改多文件中序列名 |
您所在的位置:网站首页 › awk 替换某一列 › linux文件格式处理命令cut,grep,sed,awk:批量修改多文件中序列名 |
要处理一份10多个G序列数据的序列名,据说直接的linux命令是最快的,回头来复习一下这几个命令吧。 什么是选取命令? 就是将一段数据经过分析后,取出我们想要的或者经由分析关键词,取出我们想要的那一行。通常选取信息是针对一行一行来分析的,并不是整篇分析。 ** 1 cut** cut命令可以将一段信息的某一段给它切出来,也就是将一行里面的数据进行分解,它是以行为单位处理数据的。 常用的有两种: (1)对于有特定分隔字符的的文本,分隔后获取其第m‘区域’与n‘区域’的信息: cut -d '分隔的字符' -f m,n filename(2)对于排列整齐的信息,获取其一行中m到n字符处的信息: cut -c m-n filename** grep** cut命令是将一行信息当中取出部分我们想要的,而grep则是分析一行信息,若当中有我们所需要的信息,就将该行拿出来。 简单的语法是这样的: grep [-acinv] '查找字符' filename选项参数为: -a 将二进制文件以文本文件的方式查找数据 -c 计算找到’查找字符’的次数 -i忽略大小写 -n输出行号 -v反向选择 假设我们要提取出一个fasta序列文件中的标题行: grep '>' fasta.faa那再顺道统计一下序列条数吧: grep '>' fasta.faa | wcgrep还有一些进阶功能: grep [-A] [-B] '查找字符' filename选项参数: -A after的意思,指除了该行外还再列出该行后多少行 -B before的意思,指除了该行外还再列出该行前多少行 假设我们要查询文件中一个名为“xueba”的蛋白序列,忽略大小写更靠谱: grep -A 30 -i 'xueba' filenamegrep是支持正则表达式的,可以方便我们对数据进行搜索,不知道python的正则表达式与linux中是不是一样的,下次好好看看再写写吧。 ** sed** sed可以对数据进行替换、删除、新增选取特定行等功能,相当有用。 基本语法: sed [-nefri] [m[,n]] [acdips] filename选项参数: -n:安静模式,加上n后只有被处理的行才会输出到屏幕上 -e:直接在命令行模式上进行sed的操作 -f:直接将sed的操作写在一个文件内, -f filename 则可以执行filename内的sed操作 -r: sed操作使用的是扩展型正则表达式语法 -i:直接修改读取文件的内容,而不是由屏幕输出 [m[,n]]:待操作行,m到n行,非必须参数 功能参数: a:新增,a后面接字符,这些字符会在当前行的下一行出现 c:替换,c后面接字符,这些字符会替换n1到n2行的内容 d:删除 i:插入,i后面接字符,这些字符会在当前行的上一行出现 p:打印,将某个选择的数据打印出来,常与sed -n一起用 s:替换,可以直接进行替换工作,可以搭配正则表达式,是我们最常用的功能 看例子: sed行处理 (1)删除第n到最后一行: sed 'n,$d' filename(2)在第n行后增加‘xueba’ sed 'na xueba' filename(3)在第n行后增加’xueba’和’daxueba’两行: sed 'na xueba \ daxueba' filename(4)将m到n行替换为’xueba’: sed 'm,nc xueba' filename(5)取出第m到n行: sed -n 'm,np' filenamesed替换功能 常用语法: sed 's/要被替换的字符/新的字符/g' filename(1)将’xueba’替换为’daxueba’: sed 's/xueba/daxueba/g' filename(2)删除文件中的注释行和空白行: sed 's/#.*$//g' | sed '/^$/d' filename(3)直接对文件进行替换更改,加-i参数 sed -i 's/xueba/daxueba/g' filename** awk** sed常常用于一整个行的处理,awk则倾向于将一行分成数个字段处理,awk更适合处理小型数据。 回头补上这段… … ############################################################ 回到正题来,现在我有几十个G序列文件,内容如下所示,我想给每个序列的>后加上文件名,形成>filename_gene_…的格式: >gene_3|GeneMark.hmm IGYAQEPIEISAGKRGSETYIYIYIYIYIYIYIHRWAEPAKIDMKAHTGVGGVSA >gene_4|GeneMark.hmm WRDFILPRLDLEKMIDEQTGLPFSREKLELAFTDSHERIRTDGMVDLDPGKASGSKALAN RNQDHRFFVFKDADSWMEYMARDIAMMEVLGPNPDLTIRFL使用循环来对所有文件执行替换: for file in `ls $1` do eval sed -i 's/gene_/${file%.*}_gene_/' $file done修改后的结果: >aaa_gene_3|GeneMark.hmm IGYAQEPIEISAGKRGSETYIYIYIYIYIYIYIHRWAEPAKIDMKAHTGVGGVSA >aaa_gene_4|GeneMark.hmm WRDFILPRLDLEKMIDEQTGLPFSREKLELAFTDSHERIRTDGMVDLDPGKASGSKALAN RNQDHRFFVFKDADSWMEYMARDIAMMEVLGPNPDLTIRFL注意! (1)使用[for file in `ls $1`]对当前目录下所有文件执行遍历,[`ls $1`]两旁使用的不是单引号,是英文输入法状态下键盘tab键上面的那个 ` 字符。 (2)eval会扫描两次要执行的操作,先识别其中的变量${file}内容后再执行操作。也可以不使用eval,而使用"s/gene_/${file%.*}gene/",双引号将语句括起来。 (3)若是产生"sed:-e 表达式 #1,字符 11:“s”的未知选项"的报错的话,说明我们的变量名中含有与sed操作’s/gene_/${file}gene/'相同的符号,这时候可以使用#替换/,或者使用!也可以! (4)如果文件名是aaa.txt,最后怎么去掉.txt呢?使用${file%.*},它表示删除右边算起第一个.右边的内容.txt,只保留左边aaa。 这里使用${}来对变量的进行提取和替换等操作,它可以以任意字符作为处理的'flag',和#与%一起使用,来达到我们想要的结果: 其中: #:表示从左边算起第一个 %:表示从右边算起第一个 ##:表示从左边算起最后一个 %%:表示从右边算起最后一个 即:#总是表示左边算(删除左边的),%总是表示右边算(删除右边的)。 *:表示要删除的内容 .表示用来分隔的字符,可以是任意字符:字母,数字,符号都可以 ${var##a*}表示删除变量var从左边算起最后一个字符a及其左边的字符。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |